package com.llu.classload;

import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;


// com.llu.classload.BaseTestClassLoad
public class BaseTestClassLoad {
    public static void main(String[] args) throws Exception {

        urlClassLoaderTest();

    }

    /**
     * 获取类加载的测试
     */
    public static void getClassLoad(){
        //        ClassLoader
        // 获取类加载器
        ClassLoader classLoader = BaseTestClassLoad.class.getClassLoader();
        /**
         * |--sun.misc.Launcher$AppClassLoader@18b4aac2
         * 	|--sun.misc.Launcher$ExtClassLoader@4554617c
         * 		|--null
         */
//        ClassLoader classLoader = String.class.getClassLoader();
        // null

        // 初始化一个字符串构建器，用于在输出时表示层级关系
        StringBuilder split = new StringBuilder("|--");
        // 设置继续循环的标志位为true
        boolean needContinue = true;

        // 循环输出类加载器信息，直到没有上级类加载器为止
        while (needContinue){
            // 输出当前类加载器信息，前面加上层级表示字符
            System.out.println(split.toString() + classLoader);
            // 如果当前类加载器为null，则表示已经是顶级类加载器，不再有上级类加载器
            if(classLoader == null){
                // 设置标志位为false，结束循环
                needContinue = false;
            }else{
                // 获取当前类加载器的上级类加载器，继续下一次循环
                classLoader = classLoader.getParent();
                // 调整层级表示字符的缩进，增加一个制表符以表示更深层次的类加载器
                split.insert(0, "\t");
            }
        }
    }

    public static void classloadTest() throws ClassNotFoundException {
        // 获取类加载器
        ClassLoader loader = BaseTestClassLoad.class.getClassLoader();
        System.out.println(loader);
        //使用ClassLoader.loadClass()来加载类，不会执行初始化块
//        loader.loadClass("com.llu.classload.Test2");
        //使用Class.forName()来加载类，默认会执行初始化块
//                Class.forName("com.llu.classload.Test2");
        //使用Class.forName()来加载类，并指定ClassLoader，初始化时不执行静态块
                Class.forName("com.llu.classload.Test2", false, loader);
    }

    /**
     * URLClassLoader
     */
    public static void urlClassLoaderTest() throws Exception {

        // 创建 URL 数组
        URL[] urls = {
                new URL("file:///E:\\code\\Java代码审计系统学习\\CodeReviewStudy\\day15-classLoadAndReflcetAndSerial\\target\\classes"),
                new URL("http://example.com/path/to/jar")
        };

        // 创建 URLClassLoader 实例
        URLClassLoader u = new URLClassLoader(urls);

        // 加载类
        Class<?> clazz = u.loadClass("com.llu.classload.Test2");

        // 创建实例
        Object obj = clazz.newInstance();

        // 调用方法
//        clazz.getMethod("myMethod", null).invoke(obj, null);


    }



}
 class Test2 {
    static {
        System.out.println("静态初始化块执行了！");
    }
}
